<html>
				<head>
				<meta http-equiv="content-type" content="text/html; charset=UTF-8">
				</head>
				<body><pre>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.freebsd.org/cgi/man.cgi?query=PMAP_EXTRACT&sektion=9&apropos=0&manpath=FreeBSD+6.1-RELEASE">PMAP_EXTRACT(9)</a> FreeBSD Kernel Developer's Manual <a href="http://www.freebsd.org/cgi/man.cgi?query=PMAP_EXTRACT&sektion=9&apropos=0&manpath=FreeBSD+6.1-RELEASE">PMAP_EXTRACT(9)</a></pre>
<pre>
<b>名称</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pmap_extract, pmap_extract_and_hold -- 将一个虚拟地址映射到物理页面</pre>
<pre>
<b>概要</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;<font color="dark">sys/param.h</font>&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;<font color="dark">vm/vm.h</font>&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;<font color="dark">vm/pmap.h</font>&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="red">vm_paddr_t</font> <font color="blue">pmap_extract</font>(<font color="red">pmap_t</font> <font color="green">pmap</font>, <font color="red">vm_offset_t</font> <font color="green">va</font>); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="red">vm_paddr_t</font> <font color="blue">pmap_extract_and_hold</font>(<font color="red">pmap_t</font> <font color="green">pmap</font>, <font color="red">vm_offset_t</font> <font color="green">va</font>, <font color="red">vm_prot_t</font> <font color="green">prot</font>);</pre>
<pre>
<b>详述</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>pmap_extract()</font>函数将一个虚拟地址映射到物理页面上。在某些情况下需要确保返回
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的页面一直被保持(hold)，这时上层函数可能会使用<font color=blue>pmap_extract_and_hold()</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代替<font color=blue>pmap_extract()</font>。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>pmap_extract_and_hold()</font>函数同样将一个虚拟地址映射到物理页面上，但是与此同时，
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果映射中的该页面允许接受(参数<font color="green">prot</font>提供的保护权限)的情况下会自动为上层调用者
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保持(hold)返回的页面。</pre>
<pre>
<b>实现笔记</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现时，上层调用者请求的页面保护权限不会在函数中检验(verified)。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>pmap_extract_and_hold()</font>函数的整个调用过程中需要持有巨型锁(Giant lock)，
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以确保只有一个单独的调用者调用该函数。</pre>
<pre>
<b>返回值</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>pmap_extract()</font>函数返回物理页面地址，这个物理地址和物理映射<font color="green"><font color="green">pmap</font></font>中的虚拟地址<font color="green"><font color="green">va</font></font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相关联。如果映射不存在，或者参数<font color="green"><font color="green">pmap</font></font>为NULL，那么函数将返回NULL。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>pmap_extract_and_hold()</font>函数返回物理页面地址，这个物理地址和物理映射<font color="green"><font color="green">pmap</font></font>中的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟地址<font color="green"><font color="green">va</font></font>相关联。如果映射不存在，函数没有任何作用，返回NULL。</pre>
<pre>
<b>参见</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.freebsd.org/cgi/man.cgi?query=mutex&sektion=9&apropos=0&manpath=FreeBSD+6.1-RELEASE">mutex(9)</a>, <font color="green"><font color="green">pmap</font></font>(9)</pre>
<pre>
<b>历史</b>:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本手册页由Bruce M Simpson&lt;bms@spc.org&gt;撰写。</pre>
</pre>
</body></html>